Skip to main content

Hooks

Catalyst exposes two groups of hooks:

  • routing hooks from @tata1mg/router
  • native or universal app hooks from catalyst-core/hooks

Hooks Overview

HookDescriptionWebiOSAndroid
useRouterDataAccess data for all matched routesYesYesYes
useCurrentRouteDataAccess current route fetcher state and dataYesYesYes
useCameraCapture media via the bridge or web fallbackPartialYesYes
useFilePickerSelect files and normalize resultsPartialYesYes
useHapticFeedbackTrigger haptic feedback with platform-aware behaviorNoYesYes
useStoragePersist key-value data across platformsYesYesYes
useDeviceInfoRead platform and device detailsPartialYesYes
useNotificationSchedule local notifications and manage push setupNoYesYes

Partial means behavior depends on browser support or fallback behavior in the web environment.

Route Hooks

useRouterData

The useRouterData hook provides access to the data for all matched routes.

Import

import { useRouterData } from "@tata1mg/router";

Return Value

Returns an object containing data for all active routes, keyed by route path.

Usage

import { useRouterData } from "@tata1mg/router";

const Layout = () => {
const routerData = useRouterData();
// { "/dashboard": { data, error, ... }, "/dashboard/settings": { data, error, ... } }
};

useCurrentRouteData

useCurrentRouteData provides access to the data resolved by serverFetcher or clientFetcher for the current route.

Import

import { useCurrentRouteData } from "@tata1mg/router";

Return Value

PropertyTypeDescription
dataanyThe data returned by the fetcher function.
errorErrorAn error object if the fetcher function throws an error.
isFetchingbooleanA boolean indicating if a fetch is in progress.
isFetchedbooleanA boolean indicating if a fetch has completed.
refetchfunctionA function to re-run the clientFetcher.
clearfunctionA function to clear the cached data for the current route.

Requirements

This hook only works inside the RouterDataProvider tree. If the app is not wrapped in RouterDataProvider, the hook returns undefined.

Usage

import { useCurrentRouteData } from "@tata1mg/router";

const ProductPage = () => {
const { data, error, isFetching, isFetched, refetch, clear } = useCurrentRouteData();

return (
<div>
{isFetching && <Spinner />}
{error && <Error message={error.message} />}
{data && <ProductDetails product={data} />}
</div>
);
};

refetch

The refetch function can be used to re-run the clientFetcher for the current route.

const ProductList = () => {
const { data, refetch } = useCurrentRouteData();
const [page, setPage] = useState(1);

useEffect(() => {
refetch({ page });
}, [page]);

return <div>...</div>;
};

ProductList.clientFetcher = async ({ params }, { store }, { page = 1 }) => {
const response = await fetch(`/api/products?page=${page}`);
return response.json();
};

clear

The clear function can be used to remove the cached data for the current route.

const { clear } = useCurrentRouteData();

useEffect(() => {
return () => clear();
}, []);

Universal App Hooks

Import universal hooks from catalyst-core/hooks:

import {
useCamera,
useFilePicker,
useHapticFeedback,
useStorage,
useDeviceInfo,
useNotification,
} from "catalyst-core/hooks";

Most native hooks follow a common pattern:

  • data
  • loading
  • error
  • progress
  • isWeb
  • isNative
  • execute
  • clear
  • clearError

useCamera

Access camera capture through the native bridge. The hook exposes a standardized stateful interface and camera-specific aliases.

Returns

PropertyTypeDescription
dataobject \| nullCaptured file payload including file data and transport metadata
loadingbooleanCapture or permission flow in progress
errorobject \| nullStandardized error object
progressobject \| nullProgress information during the capture flow
isWebbooleanRunning in a browser context
isNativebooleanRunning inside the native shell
executefunctionPrimary camera action entrypoint
permissionobjectCamera permission state
takePhotofunctionSemantic alias for camera capture
clearfunctionClear captured data and reset state
clearErrorfunctionClear error state only

Usage

function PhotoCapture() {
const { takePhoto, loading, error, data, isNative } = useCamera();

const handleCapture = async () => {
const photo = await takePhoto();
if (photo) {
console.log("Photo captured:", photo.fileName);
}
};

return (
<button onClick={handleCapture} disabled={loading || !isNative}>
Take Photo
</button>
);
}

useFilePicker

Open the native file picker and receive a normalized result payload.

Returns

PropertyTypeDescription
dataobject \| nullNormalized file picker payload
selectedFilesarraySelected file entries
loadingbooleanPicker flow in progress
errorobject \| nullStandardized error object
executefunctionOpen the file picker
pickFilefunctionAlias for execute
getFileObjectfunctionConvert one selected result into a browser File
getAllFileObjectsfunctionConvert all selected results into File[]
clearfunctionClear picker state
clearErrorfunctionClear error state only

Usage

function FileUpload() {
const { pickFile, getAllFileObjects, loading } = useFilePicker();

const handleSelectFile = async () => {
pickFile({ mimeType: "application/pdf", multiple: true, maxFiles: 3 });
};

return <button onClick={handleSelectFile} disabled={loading}>Select File</button>;
}

useHapticFeedback

Trigger platform-specific haptic feedback with a standardized interface and semantic shortcuts.

Returns

PropertyTypeDescription
execute(feedbackType?, options?) => Promise<boolean>Trigger haptic feedback
isSupportedbooleanHaptics available on device
lightfunctionLight feedback shortcut
mediumfunctionMedium feedback shortcut
heavyfunctionHeavy feedback shortcut
successfunctionSuccess feedback shortcut
warningfunctionWarning feedback shortcut
errorHapticfunctionError feedback shortcut

Usage

function FeedbackButton() {
const { medium } = useHapticFeedback();

return <button onClick={() => medium()}>Submit</button>;
}

useStorage

Cross-platform key-value storage for universal apps.

Returns

MethodTypeDescription
getItem(key) => Promise<string>Get value by key
setItem(key, value) => Promise<void>Store value
removeItem(key) => Promise<void>Delete value
clear() => Promise<void>Clear all storage
getAllKeys() => Promise<string[]>List all keys

Usage

function UserPreferences() {
const { getItem, setItem, removeItem } = useStorage();

const saveTheme = async (theme) => {
await setItem("theme", theme);
};

return <button onClick={() => saveTheme("dark")}>Set Dark Theme</button>;
}

useDeviceInfo

Read platform and device information in a normalized format.

Returns

PropertyTypeDescription
platform"web" \| "ios" \| "android"Current platform
modelstringDevice model name
manufacturerstringDevice manufacturer
screenWidthnumberScreen width in pixels
screenHeightnumberScreen height in pixels
screenDensitynumberScreen pixel density

Usage

function DeviceDetails() {
const { platform, model, manufacturer, screenWidth, screenHeight, screenDensity } = useDeviceInfo();

return (
<div>
<p>Platform: {platform}</p>
<p>Model: {model}</p>
<p>Manufacturer: {manufacturer}</p>
<p>Screen: {screenWidth} x {screenHeight} ({screenDensity}x)</p>
</div>
);
}

useNotification

Manage local notifications and push registration from one hook.

Returns

MethodTypeDescription
dataobject \| nullLatest notification result data
loadingbooleanNotification operation in progress
errorobject \| nullStandardized error object
permissionStatusstringNotification permission status
pushTokenstring \| nullCurrent push token when available
scheduleLocalfunctionSchedule a local notification
cancelLocalfunctionCancel a scheduled local notification
registerForPushfunctionRegister for push notifications
subscribeToTopicfunctionSubscribe to a notification topic
unsubscribeFromTopicfunctionUnsubscribe from a notification topic
getSubscribedTopicsfunctionRead current topic subscriptions

Usage

function NotificationExample() {
const { scheduleLocal, registerForPush, subscribeToTopic } = useNotification();

return (
<>
<button onClick={() => scheduleLocal({ title: "Hey!", body: "You got a message" })}>
Send Local Notification
</button>
<button onClick={() => { registerForPush(); subscribeToTopic("news"); }}>
Enable Push Notifications
</button>
</>
);
}

Requirements

Push-related notification features require WEBVIEW_CONFIG.notifications.enabled = true and the relevant Firebase platform files in the native projects.